package com.hksj.Intelligentmanagement.utils;


/**
 * @Author zengke
 * @ClassName RAMPager
 * @Date 2023/4/1 9:25
 * @Version 1.0
 */

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 内存分页
 */
@Data
public class MemoryPagination<T> {

    private IPage<T> page;

    public MemoryPagination(IPage<T> page){
        this.page = page ;
    }


    /**
     * 内存分页
     * @param records 待分页数据
     * @param pageNum 当前页码
     * @param pageSize 每页显示条数
     * @return 分页之后的数据
     * @param <T> T泛型
     */
    public <T> List<T> pagination(List<T> records, int pageNum, int pageSize,IPage<T> page){
        //判断待分页的数据是否为空
        if (CollectionUtils.isEmpty(records)){
            return Collections.emptyList();
        }

        //若输入的当前页码<1则设置为=1,避免为0报错
        if (pageNum < 1){
            pageNum = 1;
        }
        //总条数
        int totalCount = records.size();

        //按每页显示条数分页后剩余的条数
        int remainder = totalCount % pageSize;

        //若remainder==0则 pageCount:分页页数为总条数除以每页显示的条数,否则为 分页页数为总条数除以每页显示的条数+1
        int pageCount = (remainder > 0) ? totalCount/pageSize + 1 : totalCount/pageSize;

        this.page.setTotal(totalCount);
        this.page.setPages(pageCount);

        //若总条数为1,直接返回
        if (totalCount == 1){
            return records;
        }

        if (remainder == 0 ){
            //正好分完
            return records.stream()
                    .skip((long) (pageNum - 1) * pageSize)//跳过前(pageNum-1)*pageSize条数据
                    .limit(pageSize)//取跳过后的pageSize长度的数据
                    .collect(Collectors.toList());//转换为List集合并返回
        } else {
            //没有分完 分两种情况 当前页等于分页页数,当前页不等于分页页数
            if (pageNum == pageCount){
                return records.stream()
                        .skip((long) (pageNum - 1) * pageSize)//跳过前(pageNum-1)*pageSize条数据
                        .collect(Collectors.toList()); //直接转换为List集合并返回
            }else {
                return records.stream()
                        .skip((long) (pageNum - 1) * pageSize)//跳过前(pageNum-1)*pageSize条数据
                        .limit(pageSize) //显示跳过后的pageSize长度的数据
                        .collect(Collectors.toList());//转换为List集合并返回
            }
        }

    }

}
